#include "datashow.h"
#include "ui_datashow.h"

// 构造函数，初始化DataShow窗口
datashow::datashow(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::datashow)
{
    ui->setupUi(this);

    QString currentDir = QCoreApplication::applicationDirPath();
    QString appRoot = currentDir;
    QDir dir(currentDir);
    dir.cdUp();
    dir.cdUp();
    dir.cdUp();
    appRoot = dir.absolutePath();
    QString imagePath = appRoot + "/images/MiKu_Background.png";

    // 加载背景图片并验证
    if(!m_background.load(imagePath))
    {
        qDebug() << "Failed to load background image!";
        setStyleSheet("background-color: #f0f0f0;");
    }
    else
    {
        qDebug() << "Background image loaded successfully. Size:" << m_background.size();
    }

    // 设置控件样式
    setStyleSheet(
        "QWidget { background: transparent; }"
        "QTextEdit, QPlainTextEdit {"
        "   background: rgba(255, 255, 255, 120);"
        "   border: 1px solid rgba(0, 0, 0, 50);"
        "   border-radius: 4px;"
        "}"
        "QPushButton {"
        "   background: rgba(70, 130, 180, 200);"
        "   color: white;"
        "   border-radius: 4px;"
        "   padding: 5px;"
        "}"
        );


    // JSON键值映射表
    m_textEditMap["Hum1"] = ui->DHT11_Hum1_TextEdit;
    m_textEditMap["Hum2"] = ui->DHT11_Hum2_TextEdit;
    m_textEditMap["AVE1"] = ui->DHT11_Tem1_Ave_TextEdit;
    m_textEditMap["CV1"] = ui->DHT11_Tem1_CV_TextEdit;
    m_textEditMap["AVE2"] = ui->DHT11_Tem2_Ave_TextEdit;
    m_textEditMap["CV2"] = ui->DHT11_Tem2_CV_TextEdit;
    m_textEditMap["AVE3"] = ui->Thermistor1_Tem_Ave_TextEdit;
    m_textEditMap["CV3"] = ui->Thermistor1_Tem_CV_TextEdit;
    m_textEditMap["AVE4"] = ui->Thermistor2_Tem_Ave_TextEdit;
    m_textEditMap["CV4"] = ui->Thermistor2_Tem_CV_TextEdit;

    // 心灵寄语库
    m_wiseSayings = {
        "轻舟已过万重山，低头一看没上船～",
        "空调WiFi西瓜，葛优同款沙发，我就往上一趴～",
        "今天的烦恼已售罄，请明日再来～",
        "生活就像骑单车，保持平衡最好的方式就是...继续往前蹬！",
        "早睡是理性，熬夜是任性，而我...在两者之间反复横跳～",
        "别低头，皇冠会掉；别熬夜，头发会少～",
        "成年人的快乐其实很简单：空调+手机+WiFi+没人找～",
        "夏天最佳避暑方案：心静自然凉，不行再加冰～",
        "人生就像茶叶蛋，有裂痕才入味～",
        "电量低于20%时，人和手机都没安全感～",
        "所谓成长，就是终于学会了把哭声调成静音模式～",
        "冰箱里的灯是为谁亮的？这个问题我思考了半辈子～",
        "理想中的家：猫吃鱼，狗吃肉，我在沙发上当个够～",
        "生活小窍门：如果觉得今天过不去...那就明天再说～",
        "幸福就是：空调WiFi加西瓜，追剧零食小龙虾～",
        "生活就像泡面，等三分钟嫌长，吃三分钟嫌短～",
        "我的生活态度：间歇性踌躇满志，持续性混吃等喝～",
        "今天解决不了的事，别着急...明天也解决不了～",
        "夏天的命是空调给的，但电费单是索命的～",
        "理想很丰满，现实很骨感，而我...卡在中间刚刚好～",
        "生活就像镜子，你笑它就笑，你哭...它就给你哭得更丑～",
        "成年人的崩溃都是静音的：笑着笑着就哭了，哭着哭着...又饿了～",
        "最好的生活状态：一个人，两只猫，三餐四季～",
        "人生建议：少和生命无关的人耗着，多和空调耗着～",
        "生活就像打电话：不是你先挂，就是我先挂～"
    };


    updateWiseSaying();      // 初始显示心灵寄语
    connect(ui->exitButton, &QPushButton::clicked, this, &datashow::exitButton_clicked); // 连接退出按钮的 clicked 信号到槽函数

    // 初始化统计定时器
    m_statTimer = new QTimer(this);
    connect(m_statTimer, &QTimer::timeout, this, &datashow::calculateStatistics);
    m_statTimer->start(m_statInterval); // 启动定时器

    // 初始化数据结构
    QStringList keys = {"AVE1", "AVE2", "AVE3", "AVE4", "Hum1", "Hum2"};
    for (const auto &key : keys) {
        m_sensorData[key] = QList<double>();
        m_lastAvgValues[key] = 0.0;
    }

}

datashow::~datashow()
{
    delete ui;
}

// paintEvent实现
void datashow::paintEvent(QPaintEvent *event)
{
    // qDebug() << "Paint event triggered"; // 测试连接情况
    QPainter painter(this);

    if (!m_background.isNull()) {
        // 缩放图片以适应窗口大小
        QPixmap scaled = m_background.scaled(
            this->size(),
            Qt::KeepAspectRatioByExpanding,
            Qt::SmoothTransformation
            );

        // 计算居中位置
        int x = (width() - scaled.width()) / 2;
        int y = (height() - scaled.height()) / 2;

        // 绘制背景
        painter.drawPixmap(x, y, scaled);
    }

    // 调用基类的paintEvent绘制其他控件
    QWidget::paintEvent(event);
}

// 新增统计计算函数
void datashow::calculateStatistics()
{
    QString output;
    QTextStream stream(&output);
    stream << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")
           << " 统计信息:\n";

    // 计算每个传感器的平均值和变化量
    for (auto it = m_sensorData.begin(); it != m_sensorData.end(); ++it) {
        const QString &key = it.key();
        QList<double> &data = it.value();

        if (data.isEmpty()) continue;

        double sum = std::accumulate(data.begin(), data.end(), 0.0);
        double avg = sum / data.size();
        double change = avg - m_lastAvgValues[key];

        // 保存当前平均值供下次使用
        m_lastAvgValues[key] = avg;

        // 格式化输出
        QString sensorName;
        if (key.startsWith("AVE")) {
            sensorName = QString("温度传感器%1").arg(key.right(1));
            stream << "  " << sensorName << ": "
                   << QString::number(avg, 'f', 2) << "°C"
                   << " (变化: " << QString::number(change, 'f', 2) << "°C)\n";
        } else if (key.startsWith("Hum")) {
            sensorName = QString("湿度传感器%1").arg(key.right(1));
            stream << "  " << sensorName << ": "
                   << QString::number(avg, 'f', 2) << "%"
                   << " (变化: " << QString::number(change, 'f', 2) << "%)\n";
        }

        // 清空当前周期数据
        data.clear();
    }

    // 输出到日志框
    if (!output.isEmpty()) {
        // 如果超过最大刷新次数，清空日志
        if (datashow_logRefreshCount >= DataShow_MAX_REFRESH_COUNT)
        {
            ui->Tem_Hum_Log_TextEdit->clear();
            datashow_logRefreshCount = 0;   // 重置计数器
        }
        ui->Tem_Hum_Log_TextEdit->appendPlainText(output);
        datashow_logRefreshCount++;         // 递增计数器
    }

    // 生成并显示智能建议
    QString advice = generateAdvice(m_lastAvgValues);
    ui->Intelligent_Advice_PlainTextEdit->clear();
    ui->Intelligent_Advice_PlainTextEdit->setPlainText(advice);

    // 更新心情日志（每两次统计更新一次）
    static int counter = 0;
    if (++counter % 2 == 0)
    {
        updateWiseSaying();
    }
}

// 更新心情日志
void datashow::updateWiseSaying()
{
    if (m_wiseSayings.isEmpty()) return;

    // 随机选择两条不同寄语
    int index1 = QRandomGenerator::global()->bounded(m_wiseSayings.size());
    int index2;
    do {
        index2 = QRandomGenerator::global()->bounded(m_wiseSayings.size());
    } while (index2 == index1 && m_wiseSayings.size() > 1);

    // 创建排版
    QString decorated =
        "💖 心灵驿站 💖\n"
        "——————————————————————\n"
        "🌷 生活小贴士:\n"
        "  " + m_wiseSayings[index1] + "\n\n"
        "🍀 今日份温暖:\n"
        "  " + m_wiseSayings[index2] + "\n"
        "——————————————————————\n"
        "✨ 更新于 " + QDateTime::currentDateTime().toString("hh:mm");

    ui->Mood_Counselor_plainTextEdit->setPlainText(decorated);
}

// 建议生成函数，根据传感器数据生成建议
QString datashow::generateAdvice(const QMap<QString, double>& avgValues)
{
    QStringList adviceList;

    // 温度建议规则
    if (avgValues.contains("AVE1")) {
        double temp = avgValues["AVE1"];
        if (temp < 10) {
            adviceList << "❄️ 客厅现在有点冷呢 (~"+QString::number(temp,'f',1)+"°C) " "~记得穿上暖暖的毛衣，喝杯热茶吧！";
        } else if (temp < 18) {
            adviceList << "🍃 客厅温度凉爽舒适 (~"+QString::number(temp,'f',1)+"°C) " "~这是读书放松的好天气呢~";
        } else if (temp < 24) {
            adviceList << "🌤️ 客厅温度宜人 (~"+QString::number(temp,'f',1)+"°C) " "~最理想的生活温度，享受居家时光吧！";
        } else if (temp < 28) {
            adviceList << "☀️ 客厅有点暖和 (~"+QString::number(temp,'f',1)+"°C) " "~可以打开窗户通通风哦~";
        } else {
            adviceList << "🔥 客厅比较热 (~"+QString::number(temp,'f',1)+"°C) " "~空调已就绪，要开启凉爽模式吗？";
        }
    }

    if (avgValues.contains("AVE2")) {
        double temp = avgValues["AVE2"];
        if (temp < 16) {
            adviceList << "🛌 卧室温度 (~"+QString::number(temp,'f',1)+"°C) " "~睡前记得加条毯子，保暖才能睡得更香~";
        } else if (temp < 22) {
            adviceList << "🌙 卧室温度完美 (~"+QString::number(temp,'f',1)+"°C) " "~科学研究表明这是最佳睡眠温度哦！";
        } else if (temp < 26) {
            adviceList << "🌡️ 卧室有点温暖 (~"+QString::number(temp,'f',1)+"°C) " "~可以换成薄一点的被子呢";
        } else {
            adviceList << "🥵 卧室较热 (~"+QString::number(temp,'f',1)+"°C) " "~高温可能影响睡眠质量，建议降温后再就寝";
        }
    }

    // 湿度建议规则
    if (avgValues.contains("Hum1")) {
        double hum = avgValues["Hum1"];
        if (hum < 30) {
            adviceList << "🏜️ 客厅空气干燥 (~"+QString::number(hum,'f',0)+"%) " "~皮肤容易缺水，加湿器和小绿植都是好帮手~";
        } else if (hum < 50) {
            adviceList << "🍵 客厅湿度舒适 (~"+QString::number(hum,'f',0)+"%) " "~来杯热饮享受这恰到好处的湿润吧~";
        } else if (hum < 65) {
            adviceList << "🌧️ 客厅湿度略高 (~"+QString::number(hum,'f',0)+"%) " "~衣物可能需要更长时间晾干哦";
        } else {
            adviceList << "☔ 客厅比较潮湿 (~"+QString::number(hum,'f',0)+"%) " "~记得定期开窗通风，防止霉菌滋生";
        }
    }

    if (avgValues.contains("Hum2")) {
        double hum = avgValues["Hum2"];
        if (hum < 40) {
            adviceList << "🧴 卧室湿度 (~"+QString::number(hum,'f',0)+"%) " "~空气干燥，睡前可以涂抹些润肤乳哦";
        } else if (hum < 55) {
            adviceList << "🛏️ 卧室湿度完美 (~"+QString::number(hum,'f',0)+"%) " "~这个湿度下被窝会特别舒服呢~";
        } else {
            adviceList << "🌫️ 卧室有点闷 (~"+QString::number(hum,'f',0)+"%) " "~被子可能会感觉潮潮的，需要除湿吗？";
        }
    }

    // 组合建议时的美化
    if (!adviceList.isEmpty()) {
        QString header = "✨ 来自智能家居的小贴士 ✨\n——————————————————————————————\n";
        QString footer = "\n——————————————————————————————\n✨ 更新于  " + QDateTime::currentDateTime().toString("hh:mm");

        return header + adviceList.join("\n🌱  🌱  🌱  🌱  🌱  🌱  🌱  🌱\n") + footer;
    }

    // 没有数据时
    return "🏠 正在等待传感器数据... " "喝杯咖啡稍等片刻吧~";
}

// 读取并显示信号挂载消息的槽函数
void datashow::displayMessage(const QString &message)
{
    // 查找 JSON 数据的起始位置（第一个 '{' 字符）
    int jsonStart = message.indexOf("{");
    if (jsonStart == -1)
    {
        ui->Tem_Hum_Log_TextEdit->appendPlainText("No JSON data found in message");
        return;
    }

    // 查找 JSON 数据的结束位置（第一个 '}' 字符，从jsonStart开始查找）
    int jsonEnd = message.indexOf("}", jsonStart);
    if (jsonEnd == -1) {
        ui->Tem_Hum_Log_TextEdit->appendPlainText("Invalid JSON data in message");
        return;
    }

    // 提取 JSON 数据部分（从jsonStart到jsonEnd）
    QString jsonPart = message.mid(jsonStart, jsonEnd - jsonStart + 1);

    // 将 JSON 字符串转换为 QJsonDocument对象，parseError用于捕获解析错误
    QJsonParseError parseError;
    QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonPart.toUtf8(), &parseError);

    // 检查jsonDoc是否为空
    if (jsonDoc.isNull()) {
        ui->Tem_Hum_Log_TextEdit->appendPlainText("Failed to parse JSON: " + parseError.errorString());
        return;
    }

    // 检查jsonDoc是否为JSON对象
    if (jsonDoc.isObject()) {
        QJsonObject jsonObj = jsonDoc.object(); // 获取JSON对象

        // 遍历映射关系，更新每个 QTextEdit 对象
        for (auto it = m_textEditMap.constBegin(); it != m_textEditMap.constEnd(); ++it) {
            const QString &key = it.key();
            QTextEdit *textEdit = it.value();

            if (jsonObj.contains(key)) {
                QJsonValue value = jsonObj[key];
                QString valueStr;

                if (value.isDouble()) {
                    valueStr = QString::number(value.toDouble());
                } else if (value.isString()) {
                    valueStr = value.toString();
                } else {
                    valueStr = "N/A";
                }

                // 更新对应的 QTextEdit
                textEdit->setHtml(QString("<p align='center' style='font-size:12pt;' >%1</p>").arg(valueStr));
            }
            else
            {
                // 如果键不存在，清空对应的 QTextEdit
                //textEdit->setPlainText("N/A");
                textEdit->setHtml(QString("<p align='center' style='font-size:12pt;' >%1</p>").arg("N/A"));
            }
        }
    }
    else
    {
        ui->Tem_Hum_Log_TextEdit->appendPlainText("Invalid JSON format");
    }

    // 在显示数据后添加数据收集逻辑
    if (jsonDoc.isObject()) {
        QJsonObject jsonObj = jsonDoc.object();

        for (auto it = m_textEditMap.constBegin(); it != m_textEditMap.constEnd(); ++it) {
            const QString &key = it.key();

            // 只收集AVE和Hum系列的数据
            if (key.startsWith("AVE") || key.startsWith("Hum")) {
                if (jsonObj.contains(key)) {
                    QJsonValue value = jsonObj[key];
                    if (value.isDouble()) {
                        m_sensorData[key].append(value.toDouble());
                    } else if (value.isString()) {
                        bool ok;
                        double numValue = value.toString().toDouble(&ok);
                        if (ok) {
                            m_sensorData[key].append(numValue);
                        }
                    }
                }
            }
        }
    }

    // 传感器状态显示
    ui->DHT11_1_Work_Status_TextEdit->setHtml(QString("<p align='center' style='font-size:12pt;' >%1</p>").arg("正常"));
    ui->DHT11_2_Work_Status_TextEdit->setHtml(QString("<p align='center' style='font-size:12pt;' >%1</p>").arg("正常"));
    ui->Thermistor1_Work_Status_TextEdit->setHtml(QString("<p align='center' style='font-size:12pt;' >%1</p>").arg("正常"));
    ui->Thermistor2_Work_Status_TextEdit->setHtml(QString("<p align='center' style='font-size:12pt;' >%1</p>").arg("正常"));

}

// 添加设置统计间隔的公共函数
void datashow::setStatInterval(int seconds)
{
    m_statInterval = seconds * 1000; // 转换为毫秒
    m_statTimer->setInterval(m_statInterval);
}

// 退出按钮点击处理槽函数
void datashow::exitButton_clicked()
{

    this->close(); // 关闭当前窗口
}


